home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / kowin / font / tcwin24s.lzh / __main.s next >
Text File  |  1992-01-15  |  10KB  |  538 lines

  1. *************************************************************************
  2. *    C-RunTime Routine                        *
  3. *1987/12/10    ARGC,ARGV ノ DEBUG                    *
  4. *************************************************************************
  5. * Copyright 1987 SHARP/Hudson        (1987/11/03)            *
  6.  
  7. _STACK_MIN    equ    4096
  8. _HEAP_MIN    equ    8*1024
  9. LIB_STACK    equ    1024
  10.  
  11.     xdef    __main            . startup main
  12.     xdef    __stack_over
  13.     xdef    __fmode
  14.     xdef    __liobuf
  15.     xdef    __argbuffer
  16.     xdef    __argvector
  17.     xdef    __argc
  18.     xdef    __argv
  19.     xdef    __cmdline
  20.     xdef    _environ
  21.     xdef    __ENV0
  22.     xdef    __ENV1
  23.     xdef    __PSP
  24.     xdef    __PSTA
  25.     xdef    __PEND
  26.     xdef    __DSTA
  27.     xdef    __DEND
  28.     xdef    __BSTA
  29.     xdef    __BEND
  30.     xdef    __SSTA
  31.     xdef    __SEND
  32.     xdef    __HSTA
  33.     xdef    __HDEF
  34.     xdef    __HEND
  35.     xdef    MALLOCP
  36.     xdef    _daylight
  37.     xdef    _timezone
  38.     xdef    _tzname
  39.     xdef    _tzstn
  40.     xdef    _tzdtn
  41.     xdef    _errno
  42.     xdef    __doserrno
  43.     xdef    __iob
  44.     xdef    __pback
  45.  
  46.     xref    _STACK_SIZE
  47.     xref    _HEAP_SIZE
  48.     xref    _main            . for user's main
  49.     xref    _tzset
  50.     xref    _malloc
  51.     xref    __getiob        . for standard iob set
  52.     xref    _exit
  53.     xref    __exit
  54.  
  55.     include    doscall.mac
  56.     include    stdio.mac
  57.     include    fcntl.mac
  58.  
  59.     comm    _errno,4
  60.     comm    __doserrno,4
  61.     comm    __iob,(SIZE_IOBUF*__NFILE)
  62.     comm    __pback,2
  63.  
  64. *000000    mem pointer(16)
  65. *000010    PSP    __PSP
  66. *000100    -----    __PSTA
  67. *    .text(program)
  68. *         (lib program & data)
  69. *    -----    __PEND
  70. *??????    -----    __DSTA
  71. *    .data(data)
  72. *    -----    __DEND
  73. *??????    -----    __BSTA
  74. *    .bss(C text bss)
  75. *    .stack(clib bss)
  76. *    -----    __BEND
  77. *    ds.b    LIB_STACKバイト(スタックの余裕)
  78. *??????    -----    __SSTA
  79. *    ds.b    _STACK_SIZE(stack & auto)
  80. *    -----    __SEND
  81. *??????    -----    _environ
  82. *    ds.b    envlen/2*4
  83. *    ds.b    envlen
  84. *    ds.b    envlen
  85. *??????    -----    __HSTA
  86. *    ds.b    _HEAP_SIZE
  87. *??????    -----    __HDEF(rblkでここにもどすことが出来る)
  88. *??????    -----    __HEND(sblkで変更可能)
  89. *    OS free area
  90. *    child & level 2 mem管理
  91.  
  92.     .text
  93.     dc.b    'C library for X68000 XCコンパイラ v1.00',0
  94.     dc.b    'Copyright 1987 SHARP/hudson',0
  95.     .even
  96.  
  97. __main:
  98.     lea    initstack,sp        . work
  99.     move.l    a2,__cmdline        . コマンド・ライン アドレス セット
  100.     move.l    a3,__ENV0        . 環境アドレス セット
  101.     bsr    _getarg            . /stack:100k /heep:65536 可能
  102.     lea    $100(a0),a5
  103.     move.l    a5,__PSTA
  104.     move.l    $34(a0),d0
  105.     move.l    d0,__PEND
  106.     move.l    d0,__DSTA
  107.     move.l    $30(a0),d0
  108.     move.l    d0,__DEND
  109.     move.l    d0,__BSTA
  110.     move.l    a1,__BEND
  111.     lea    16(a0),a5
  112.     move.l    a1,d1
  113.     addq.l    #1,d1
  114.     and.l    #$fffffe,d1
  115.     add.l    #LIB_STACK,d1        . lib stack
  116.     move.l    d1,__SSTA
  117.     move.l    __STACK,d0
  118.     cmp.l    #_STACK_MIN,d0
  119.     bcc    stackok
  120.     move.l    #_STACK_MIN,d0
  121. stackok:
  122.     addq.l    #1,d0
  123.     and.l    #$fffffe,d0
  124.     add.l    d0,d1
  125.     move.l    d1,__SEND
  126.     move.l    d1,_environ
  127.     move.l    __ENV0,a0
  128.     move.l    (a0),d0
  129.     addq.l    #5,d0    *    addq.l    #4,d0            . NULL space
  130.     and.l    #$FFFFFE,d0    * add 1988/01/16
  131.     add.l    d0,d1
  132.     move.l    d1,__ENV1
  133.     move.l    __ENV0,a0
  134.     addq.l    #4,a0
  135.     moveq.l    #0,d0
  136. envlenc2:
  137.     addq.l    #1,d0
  138.     tst.b    (a0)+
  139.     beq    envlenok
  140. envlenck:
  141.     addq.l    #1,d0
  142.     tst.b    (a0)+
  143.     bne    envlenck
  144.     bra    envlenc2
  145. envlenok:
  146.     addq.l    #1,d0
  147.     and.l    #$fffffe,d0
  148.     add.l    d0,d1
  149.     move.l    d1,__HSTA
  150.     move.l    __HEAP,d0
  151.     cmp.l    #_HEAP_MIN,d0
  152.     bcc    heapok
  153.     move.l    #_HEAP_MIN,d0
  154. heapok:
  155.     add.l    #12+1,d0
  156.     and.l    #$fffffe,d0
  157.     add.l    d0,d1
  158.     move.l    d1,__HDEF
  159.     move.l    d1,__HEND
  160.     move.l    a5,__PSP        . メモリ管理ポインタ・アドレス セット
  161.     sub.l    a5,d1            . 当プログラム・サイズ
  162.     move.l    d1,-(sp)        . 確保する領域サイズ セット
  163.     move.l    a5,-(sp)        . 確保する領域の先頭アドレス セット
  164.     DOS    _SETBLOCK        . 空き領域確保
  165.     addq.l    #8,sp
  166.     tst.l    d0
  167.     bmi    _memerr
  168.  
  169.     move.l    __SEND,sp
  170.  
  171. *    ヒープ領域の初期化
  172.     move.l    __HSTA,a0
  173.     move.l    a0,MALLOCP
  174.     lea    16(a0),a1
  175.     clr.l    (a0)+
  176.     move.l    a1,(a0)+
  177.     clr.l    (a0)+
  178.     move.l    #'HEAP',(a0)
  179.  
  180. *    env copy
  181.     move.l    __ENV0,a0
  182.     move.l    __ENV1,a1
  183.     addq.l    #4,a0
  184. envcpy:
  185.     move.b    (a0)+,(a1)+
  186.     beq    envcpe
  187. envcp0:
  188.     move.b    (a0)+,(a1)+
  189.     bne    envcp0
  190.     bra    envcpy
  191. envcpe:
  192.     move.l    __ENV1,a0
  193.     move.l    _environ,a1
  194. envcp1:
  195.     tst.b    (a0)
  196.     beq    envend
  197.     move.l    a0,(a1)+
  198. envskp:
  199.     tst.b    (a0)+
  200.     bne    envskp
  201.     bra    envcp1
  202. envend:
  203.     clr.l    (a1)
  204.  
  205. envok:
  206. *    グローバル領域の初期化
  207.     clr.w    __pback
  208.     clr.l    __fmode            . text mode
  209.     lea    __liobuf,a0
  210.     lea    liomod,a1
  211.     moveq.l    #0,d1
  212. lioinit:
  213.     move.l    d1,-(sp)        . 0,d1.w
  214.     DOS    _IOCTRL
  215.     addq.l    #4,sp
  216.     move.b    d1,(a0)+
  217.     move.b    d0,(a0)+
  218.     move.w    (a1)+,(a0)+
  219.     addq.w    #1,d1
  220.     cmp.w    #5,d1
  221.     bne    lioinit
  222.  
  223.     move.l    #((__NFILE)*SIZE_IOBUF)-1,d0
  224.     move.l    #__iob,a0
  225. _loop:
  226.     clr.b    (a0)+
  227.     dbra    d0,_loop
  228.  
  229.     lea    __iob,a0
  230.     lea    liomod,a1
  231.     moveq.l    #0,d1
  232. fioinit:
  233.     move.l    d1,-(sp)        . 0,d1.w
  234.     DOS    _IOCTRL
  235.     addq.l    #4,sp
  236.     btst.l    #OS_ISDEV,d0
  237.     beq    blkdev
  238.     move.l    #_IOCHARA+_IONBF,d0
  239.     bra    fiook
  240. blkdev:
  241.     move.l    #_IOBDEV,d0
  242.     movem.l    d0-d1/a1,-(sp)
  243.     move.l    a0,-(sp)
  244.     move.l    #_BUFSIZ,-(sp)
  245.     jsr    _malloc
  246.     addq.l    #4,sp
  247.     tst.l    d0
  248.     beq    _memerr
  249.     move.l    (sp)+,a0
  250.     move.l    d0,_PTR(a0)
  251.     move.l    d0,_BASE(a0)
  252.     move.l    #_BUFSIZ,_BSIZE(a0)
  253.     movem.l    (sp)+,d0-d1/a1
  254. fiook:
  255.     or.w    (a1)+,d0
  256.     clr.l    _CNT(a0)
  257.     move.l    d0,_FLAG(a0)
  258.     move.b    d1,_FILE(a0)
  259.     lea    SIZE_IOBUF(a0),a0
  260.     addq.w    #1,d1
  261.     cmp.w    #5,d1
  262.     bne    fioinit
  263.     jsr    _tzset
  264.     pea    ctrlca(pc)
  265.     move.w    #_CTRLVC,-(sp)
  266.     DOS    _INTVCS
  267.     addq.l    #6,sp
  268.     move.l    _environ,-(sp)
  269.     move.l    __argv,-(sp)
  270.     move.l    __argc,-(sp)
  271.     jsr    _main
  272.     lea    12(sp),sp
  273.     move.l    d0,-(sp)
  274.     jsr    _exit
  275.  
  276. ctrlca:
  277.     DOS    _GETPDB
  278.     move.l    #$200,d1
  279.     cmp.l    __PSP,d0
  280.     beq    mainex
  281.     move.w    d1,-(sp)
  282.     DOS    _EXIT2
  283.  
  284. __stack_over:
  285.     pea    stkmsg(pc)
  286.     DOS    _PRINT
  287.     moveq.l    #127,d1
  288. mainex:
  289.     move.l    d1,-(sp)
  290.     jsr    _exit
  291.  
  292. _memerr:
  293.     pea    errmsg(pc)
  294.     DOS    _PRINT
  295.     addq.l    #4,sp
  296.     move.l    #127,-(sp)
  297.     jsr    __exit
  298.  
  299. *    argment list make
  300. _getarg:
  301.     movem.l    a0-a2,-(sp)
  302.     lea    __argbuffer,a2        . argument buffer
  303.     lea    __argvector,a1        . argv buffer
  304.     move.l    a2,(a1)+        . argv[0] = 'C'
  305.     movem.l    a0,-(sp)
  306.     lea    $80(a0),a0
  307.  
  308. pthset:
  309.     move.b    (a0)+,(a2)+        . EXECファイルのコマンド名 セット
  310.     bne    pthset
  311.     move.l    (sp)+,a0
  312.     tst.b    -(a2)
  313.     lea    $c4(a0),a0
  314. cmdset:
  315.     move.b    (a0)+,(a2)+        . EXECファイルのコマンド名 セット
  316.     bne    cmdset
  317.  
  318.     moveq.l    #0,d0            . argc = 0
  319.     move.l    __cmdline,a0        . _Base Get
  320.     move.b    (a0)+,d1        . d1 = cmd line length get
  321.     beq    ArgExit            . No argument
  322.  
  323. ArgLp0:
  324.     move.b    (a0)+,d1
  325.     beq    ArgEx            . パラメータ終了コード検出
  326.     cmpi.b    #$09,d1            . TAB ?
  327.     beq    ArgLp0
  328.     cmpi.b    #$20,d1            . SPACE ?
  329.     beq    ArgLp0
  330.     addq.l    #1,d0            . argc++
  331.     move.l    a2,(a1)+        . argv[1]= address
  332.     cmp.b    #$27,d1            . '
  333.     beq    ArgLp27
  334.     cmp.b    #$22,d1            . "
  335.     bne    ArgLoop
  336. ArgLp22:
  337.     move.b    (a0)+,d1
  338.     beq    ArgEx
  339.     cmp.b    #$22,d1            . "
  340.     beq    ArgEx
  341.     move.b    d1,(a2)+
  342.     bra    ArgLp22
  343. ArgLp27:
  344.     move.b    (a0)+,d1
  345.     beq    ArgEx
  346.     cmp.b    #$27,d1            . "
  347.     beq    ArgEx
  348.     move.b    d1,(a2)+
  349.     bra    ArgLp27
  350. ArgLoop:
  351.     move.b    d1,(a2)+        . パラメータセット(*argv[d0]++)
  352.     move.b    (a0),d1
  353.     beq    ArgEx
  354.     cmp.b    #$22,d1
  355.     beq    ArgEx
  356.     cmp.b    #$27,d1
  357.     beq    ArgEx
  358.     addq.l    #1,a0
  359.     cmpi.b    #$09,d1            . TAB ?
  360.     beq    ArgEx
  361.     cmpi.b    #$20,d1            . SPACE ?
  362.     bne    ArgLoop
  363. ArgEx:
  364.     clr.b    (a2)+            . stop code セット
  365.     movem.l    d1/a0/a2,-(sp)
  366.     move.l    -4(a1),a2
  367.     move.b    (a2)+,d1
  368.     cmp.b    #'-',d1
  369.     beq    chklbl
  370.     cmp.b    #'/',d1
  371.     bne    nochk
  372. *    bra    chk_jmp        * 1991 COR.
  373. chk_jmp:
  374.     lea    stackms(pc),a0
  375.     bsr    a0a2ck
  376.     beq    stkset
  377.     lea    heapms(pc),a0
  378.     bsr    a0a2ck
  379.     bne    nochk
  380.     bsr    numget
  381.     move.l    d1,__HEAP
  382. a1a2bk:
  383.     movem.l    (sp)+,d1/a0/a2
  384.     move.l    -(a1),a2
  385.     subq.l    #1,d0
  386.     bra    argexc
  387. stkset:
  388.     bsr    numget
  389.     move.l    d1,__STACK
  390.     bra    a1a2bk
  391. ** 1991 COR.
  392. WindowHeapSet:
  393.     .xref    _WindowHeapSize
  394.     bsr    numget
  395.     move.l    d1,_WindowHeapSize
  396.     bra    a1a2bk
  397. wswitche_set:
  398.     .xref    _Gmode
  399.     addq.w    #1,_Gmode
  400.     bra    a1a2bk
  401. **
  402. **
  403. chklbl:
  404. ** 1991 COR.
  405. *    cmp.b    #'-',(a2)
  406. *    bne    chk_jmp
  407. *    addq.l    #1,a2
  408.     move.b    (a2)+,d1
  409.     cmp.b    #'m',d1
  410.     beq    WindowHeapSet
  411.     cmp.b    #'g',d1
  412.     beq    wswitche_set
  413. *    bra    nochk
  414. **
  415. nochk:
  416.     movem.l    (sp)+,d1/a0/a2
  417. argexc:
  418.     tst.b    d1
  419.     bne    ArgLp0
  420. ArgExit:
  421.     move.b    d1,(a2)+        . stop code セット
  422.     lea    __argvector,a0
  423.     addq.l    #1,d0            . argc++
  424.     move.l    d0,__argc
  425.     move.l    a0,__argv
  426.     movem.l    (sp)+,a0-a2
  427.     rts
  428.  
  429. a0a2ck:
  430.     movem.l    a2,-(sp)
  431. a0a2cl:
  432.     move.b    (a0)+,d1
  433.     beq    a0a2ok
  434.     move.b    (a2)+,d2
  435.     beq    a0a2ng
  436.     or.b    #$20,d2
  437.     cmp.b    d2,d1
  438.     beq    a0a2cl
  439. a0a2ng:
  440.     tst.b    d1
  441.     movem.l    (sp)+,a2
  442.     rts
  443. a0a2ok:
  444.     addq.l    #4,sp
  445.     rts
  446.  
  447. numget:
  448.     moveq.l    #0,d1
  449.     moveq.l    #0,d2
  450. numgl:
  451.     move.b    (a2)+,d2
  452.     sub.b    #'0',d2
  453.     cmp.b    #10,d2
  454.     bcc    numgte
  455.     add.l    d1,d1
  456.     move.l    d1,d3
  457.     add.l    d1,d1
  458.     add.l    d1,d1
  459.     add.l    d3,d1
  460.     add.l    d2,d1
  461.     bra    numgl
  462. numgte:
  463.     add.b    #'0',d2
  464.     or.b    #$20,d2
  465.     cmp.b    #'k',d2
  466.     bne    numnok
  467.     asl.l    #8,d1
  468.     asl.l    #2,d1
  469. numnok:
  470.     bclr.l    #0,d1
  471.     rts
  472.  
  473. *****************************************
  474. *    コンスタント領域定義        *
  475. *****************************************
  476.  
  477. liomod:
  478.         dc.w    O_RDONLY+O_TEXT    . con in
  479.         dc.w    O_WRONLY+O_TEXT    . con out
  480.         dc.w    O_RDWR+O_TEXT    . con err
  481.         dc.w    O_RDWR+O_TEXT    . aux
  482.         dc.w    O_WRONLY+O_TEXT    . prn
  483. _tzname:    dc.l    _tzstn
  484.         dc.l    _tzdtn
  485. _tzstn:        dc.b    'JST',0        . パシフィック・タイムゾーン
  486. _tzdtn:        dc.b    0,0,0,0        . 夏時間調整を行う
  487. _daylight:    dc.l    0        . 夏時間採用の有無
  488. _timezone:    dc.l    -9*60*60    . グリニッジ時間との誤差
  489.     .even
  490. __STACK:    dc.l    _STACK_SIZE
  491. __HEAP:        dc.l    _HEAP_SIZE
  492.  
  493. ** 1991 COR.
  494. errmsg:        dc.b    '主記憶が不足しています',$0D,$0A,0
  495. stkmsg:        dc.b    'Stack overflow',$0D,$0A,0
  496. stackms:    dc.b    'stack:',0
  497. heapms:        dc.b    'heap:',0
  498. *wheapms:    dc.b    'wheap:',0
  499. **
  500.         .dc.b    'MiniTERM Copyright 1991 H.Ogasawara(COR.)',0
  501.  
  502.     .stack
  503.  
  504. *    ストレージ領域定義
  505.  
  506.     .even
  507. __PSP:        ds.l    1
  508. __PSTA:        ds.l    1
  509. __PEND:        ds.l    1
  510. __DSTA:        ds.l    1
  511. __DEND:        ds.l    1
  512. __BSTA:        ds.l    1
  513. __BEND:        ds.l    1
  514. __SSTA:        ds.l    1
  515. __SEND:        ds.l    1
  516. __HSTA:        ds.l    1
  517. __HDEF:        ds.l    1
  518. __HEND:        ds.l    1
  519. MALLOCP:    ds.l    1
  520. __ENV0:        ds.l    1        . 親の環境
  521. __ENV1:        ds.l    1        . 自分の環境
  522. _environ:    ds.l    1        . 自分の環境のポインタ配列
  523. __cmdline:    ds.l    1
  524. __argc:        ds.l    1
  525. __argv:        ds.l    1
  526. __liobuf:
  527. *        dc.b    OSのハンドラ
  528. *        dc.b    IOCTRLデバイス情報
  529. *        dc.w    オープンモード(0でOPENされていない)
  530.         ds.l    96
  531. __fmode:    ds.l    1
  532. __argbuffer:    ds.b    512
  533. __argvector:    ds.b    20*4
  534.         ds.l    20
  535. initstack:
  536.     .end    __main
  537.  
  538.